import 'dart:convert';
import 'dart:math';

import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart' as crypto;

import 'package:jvtd_flutter_utils/jvtd_flutter_utils.dart';

extension StringExtension on String {
  /// 获取倒叙字符串
  String reverse() {
    StringBuffer sb = StringBuffer();
    for (int i = this.length - 1; i >= 0; i--) {
      sb.writeCharCode(this.codeUnitAt(i));
    }
    return sb.toString();
  }

  /// 格式转换
  ///
  /// [digit] 间隔位数
  /// [pattern] 替换格式
  String formatDigitPattern({int digit = 4, String pattern = ' '}) {
    String text = this?.replaceAllMapped(new RegExp("(.{$digit})"), (Match match) {
      return "${match.group(0)}$pattern";
    });
    if (text != null && text.endsWith(pattern)) {
      text = text.substring(0, text.length - 1);
    }
    return text;
  }

  /// 格式转换(倒叙)
  ///
  /// [digit] 间隔位数
  /// [pattern] 替换格式
  String formatDigitPatternEnd({int digit = 4, String pattern = ' '}) {
    String text = reverse();
    text = formatDigitPattern(digit: digit, pattern: pattern);
    return text.reverse();
  }

  /// 手机号格式过滤
  ///
  /// [start] 首位
  /// [end] 末尾
  /// [pattern] 替换格式
  String filterMobile({int start = 3, int end = 7, String pattern = '*'}) {
    if (!isMobile()) return this;
    end = min(1, end);
    end = max(end, 11);
    start = min(0, start);
    start = max(start, end - 1);
    String replacement = '';
    for (int i = 0; i < (end - start); i++) {
      replacement += pattern;
    }
    return this.replaceRange(start, end, replacement);
  }

  /// Uri.decodeComponent
  String decodeComponent() {
    return Uri.decodeComponent(this);
  }

  /// Uri.encodeComponent
  String encodeComponent() {
    return Uri.encodeComponent(this);
  }

  /// 获取字符串md5值
  String md5() {
    var content = new Utf8Encoder().convert(this);
    var digest = crypto.md5.convert(content);
    return hex.encode(digest.bytes);
  }

  /// 获取字符串URL中携带的参数
  ///
  /// [key] 参数key
  String queryParameter(String key) {
    return UrlUtil.queryParameter(this, key);
  }

  //----------------正则校验-----------------
  /// 手机号格式校验
  ///
  /// [regex] 校验正则，选填
  bool isMobile({String regex}) {
    return MatchUtil.isMobile(this, regex: regex);
  }

  /// 电话号码校验
  ///
  /// [regex] 校验正则，选填
  bool isTel({String regex}) {
    return MatchUtil.isTel(this, regex: regex);
  }

  /// 邮箱校验
  ///
  /// [regex] 校验正则，选填
  bool isEmail({String regex}) {
    return MatchUtil.isEmail(this, regex: regex);
  }

  /// QQ校验
  ///
  /// [regex] 校验正则，选填
  bool isQQ({String regex}) {
    return MatchUtil.isQQ(this, regex: regex);
  }

  /// 中国邮政编码校验
  ///
  /// [regex] 校验正则，选填
  bool isZipCode({String regex}) {
    return MatchUtil.isZipCode(this, regex: regex);
  }

  /// 中文名称校验
  bool isChineseName() {
    return MatchUtil.isChineseName(this);
  }

  /// url校验
  ///
  /// [regex] 校验正则，选填
  bool isUrl({String regex}) {
    return MatchUtil.isUrl(this, regex: regex);
  }

  /// http校验
  bool isHttp() {
    return MatchUtil.isHttp(this);
  }

  /// 密码校验
  ///
  /// [regex] 校验正则，选填
  /// [min] 最小位数，选填
  /// [max] 最大位数，选填
  bool isPassword({String regex, int min, int max}) {
    return MatchUtil.isPassword(this, regex: regex, min: min, max: max);
  }

  /// 包含中文校验
  bool containsChinese() {
    return MatchUtil.isContainsChinese(this);
  }

  /// 包含字母校验
  bool containsLetter() {
    return MatchUtil.isContainsLetter(this);
  }

  /// 整数校验
  bool isInteger() {
    return MatchUtil.isInteger(this);
  }

  /// 身份证校验（中国）
  bool isIdCard() {
    return MatchUtil.isIdCard(this);
  }
}
